Каскадное меню - это меню, при выборе которого выпадают дополнительные пункты меню.

Создаем новый проект с помощью MFC App Wizard с именем Test Cascade как SDI и сразу жмем Finish. Итак, мы хотим добавить к меню View каскадное меню. Для этого в меню View создадим пункт меню Test и привяжем к нему функцию обработки.
void CMainFrame::OnViewTest()
{
// TODO: Add your command handler code here
}
Дальше нам надо получить указатель на пункт меню View в классе меню CMenu, как мы делали ранее.
void CMainFrame::OnViewTest()
{
CMenu* cm;
CMenu* cmSub;
cm=GetMenu();
ASSERT (cm != NULL);
cmSub=cm->GetSubMenu(2);
ASSERT (cmSub !=NULL);
}
Теперь будем добавлять каскадное меню. Первое - это надо создать идентификаторы в ресурсах, так как пункты меню связаны с идентификаторами.
//{{NO_DEPENDENCIES}}
// Microsoft Developer Studio generated include file.
// Used by Test Cascade.rc
//
......
#define ID_VIEW_TEST 32772
#define ID_POPUP1 32774
#define ID_POPUP2 32775
// Next default values for new objects
......
Теперь нам нужно объявить указатель в классе на класс CMenu:
class CMainFrame : public CFrameWnd
{
......
// Implementation
public:
CMenu* cmNew;
......
Дальше по выбору пункта меню Test создать этот класс и добавить в него пункты меню. После чего созданный класс меню добавить к существующему меню.
void CMainFrame::OnViewTest()
{
CMenu* cm;
CMenu* cmSub;
cm=GetMenu();
ASSERT (cm != NULL);
cmSub=cm->GetSubMenu(2);
ASSERT (cmSub !=NULL);
cmNew = new CMenu;
cmNew->CreatePopupMenu();
cmNew->AppendMenu(MF_STRING,ID_POPUP1,"Popup1");
cmNew->AppendMenu(MF_STRING,ID_POPUP2,"Popup2");
cmSub->AppendMenu(MF_STRING | MF_POPUP,(UINT)cmNew->m_hMenu,"Popup");
}
Обратите внимание на последнюю строчку. Мы добавляем к нашему меню указатель на новое меню, но со стилем MF_POPUP. На рисунке ниже приведен результат работы программы при выборе меню Test.

Пункты меню неактивные, так как нет обработчика. Но нам надо побеспокоиться еще и о удалении из памяти динамической переменной cmMenu:
CMainFrame::CMainFrame()
{
// TODO: add member initialization code here
cmNew=NULL;
}
CMainFrame::~CMainFrame()
{
if (cmNew!=NULL) delete cmNew;
}